package com.example.rotateimageview.draghelp

import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.widget.LinearLayout
import androidx.customview.widget.ViewDragHelper
import com.example.rotateimageview.R

/**
 * author  : Liushuai
 * time    : 2021/10/13 21:12
 * desc    :
 */
class DragLayout @JvmOverloads constructor(
        context: Context,
        attributeSet: AttributeSet?=null
) : LinearLayout(context,attributeSet) {

    lateinit var  mDragger :ViewDragHelper

    init {
        mDragger=ViewDragHelper.create(this, 1.0f, object : ViewDragHelper.Callback() {
            /**
             * 子控件拦截触摸事件
             */
            override fun tryCaptureView(child: View, pointerId: Int): Boolean {
                return true
            }

            /**
             * 手指在子控件横向滑动回调
             *
             * 返回Int，子控件新的left坐标值 如果返回left会横向跟着移动
             */
            override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int {
                return left
            }

            /**
             * 同上
             */
            override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int {
                return top
            }

//            override fun getViewVerticalDragRange(child: View): Int {
//                return 100
//            }

            /**
             * 边缘出现触摸事件，所有触摸事件点击滑动
             */
            override fun onEdgeTouched(edgeFlags: Int, pointerId: Int) {
                super.onEdgeTouched(edgeFlags, pointerId)
                Log.d("---", "onEdgeTouched" + edgeFlags)
            }

            /**
             * 边缘有拖动行为
             */
            override fun onEdgeDragStarted(edgeFlags: Int, pointerId: Int) {
                super.onEdgeDragStarted(edgeFlags, pointerId)

                //临时捕捉特定的view
                mDragger.captureChildView(findViewById(R.id.rtv), pointerId)
                Log.d("---", "onEdgeDragStarted" + edgeFlags)
            }

            /**
             * 边缘是否锁定
             * 返回true表示锁定 不会调用onEdgeDragStarted 这个回调只会在拖动边缘是触发
             */
            override fun onEdgeLock(edgeFlags: Int): Boolean {
                return super.onEdgeLock(edgeFlags)
            }

            /**
             * 手指脱离了屏幕的事件 手指铺货的View直接fling 到某个位置
             * 通过Scroller实现要重写computeScroll方法
             */
            override fun onViewReleased(releasedChild: View, xvel: Float, yvel: Float) {
                if (releasedChild.id == R.id.rtv) {
                      //恒定滑动
//                    mDragger.smoothSlideViewTo(releasedChild,0,0)
                    //起始速度是手指脱离屏幕的速度
                    mDragger.settleCapturedViewAt(0,0)
                    invalidate()
                }
            }
        }).apply {
            //边缘捕捉需要开启 边缘函数才会回调
            setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT)
        }
    }

    override fun computeScroll() {
        /**
         * continueSettling boolean 是否需要继续移动
         */
        if (mDragger.continueSettling(true)) {
            invalidate()
        }
    }
    /**
     * sensitivity 敏感度 值越大越敏感
     */

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return mDragger.shouldInterceptTouchEvent(ev!!)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        mDragger.processTouchEvent(event!!)
        return true
    }
}